package com.wbb.service.impl;

import com.wbb.mapper.TbItemCatMapper;
import com.wbb.model.TbItemCat;
import com.wbb.model.TbItemCatExample;
import com.wbb.service.ItemCatService;
import com.wbb.vo.ItemCatVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired
    private TbItemCatMapper itemCatMapper;

    private static final Long DEFAULT_TYPE_ID = 35L;

// 根据Id查询表数据
    @Override
    public List<ItemCatVo> selectByPid(Long pid) {
        TbItemCatExample example = new TbItemCatExample();
        example.createCriteria().andParentIdEqualTo(pid);
        List<TbItemCat> tbItemCats = itemCatMapper.selectByExample(example);
        return tbItemCats.stream().map(tbItemCat -> {
            ItemCatVo itemCatVo = new ItemCatVo();
            BeanUtils.copyProperties(tbItemCat, itemCatVo);
            return itemCatVo;
        }).collect(Collectors.toList());
    }

// 修改表信息
    @Override
    public void updateItemCat(TbItemCat itemCat) {
        // 1. 顶级分类 parentId = null;
        if (itemCat.getParentId() == null){
            itemCat.setParentId(0L);
            updateItemCat1(itemCat, "/");
        }else { // 2. 非顶级分类 parentId = ...;
            TbItemCat tbItemCat = itemCatMapper.selectByPrimaryKey(itemCat.getParentId());
            updateItemCat1(itemCat, tbItemCat.getParentPath()+"/");
        }

    }

    private void updateItemCat1(TbItemCat itemCat, String parentPathPrefix) {
        itemCat.setParentPath(parentPathPrefix + itemCat.getId());
        itemCatMapper.updateByPrimaryKeySelective(itemCat);
    }


// 增加表信息
/**
 * 处理商品分类的插入和更新
 * @param itemCat   待处理的商品分类对象
 */
    @Override
    public void addItemCat(TbItemCat itemCat) {
        // 1. 顶级分类 parentId = null
        if (itemCat.getParentId() == null){
           itemCat.setParentId(0L);
            insertItemCat(itemCat,"/");
        }else {
            TbItemCat tbItemCat = itemCatMapper.selectByPrimaryKey(itemCat.getParentId());
        // 对可能得null值的判断
            if (tbItemCat == null){
                throw new RuntimeException("tbItemCat不能为空");
            }
            insertItemCat(itemCat,tbItemCat.getParentPath()+"/");
        }
    }

/**
 * 插入商品分类并更新parentPath，然后保存到数据库。
 * @param itemCat 商品分类对象。
 * @param parentPathPrefix parentPath的前缀。
 */
    private void insertItemCat(TbItemCat itemCat, String parentPathPrefix) {
        itemCat.setTypeId(DEFAULT_TYPE_ID);
        itemCatMapper.insertSelective(itemCat);
        Long id = itemCat.getId();
        itemCat.setParentPath(parentPathPrefix + id);
        itemCatMapper.updateByPrimaryKeySelective(itemCat);
    }

// 根据Id删除表信息
    @Override
    public void deleteById(Long id) {
        itemCatMapper.deleteByPrimaryKey(id);
    }
// 批量删除表信息
    @Override
    public void batchItemCat(List<Long> ids) {
        TbItemCatExample example = new TbItemCatExample();
        example.createCriteria().andIdIn(ids);
        itemCatMapper.deleteByExample(example);
    }

// 查询全部数据
    @Override
    public List<Map<String, Object>> queryAll() {
        List<TbItemCat> itemCats = itemCatMapper.selectByExample(null);

        return getTree(itemCats, 0L);
    }

    private List<Map<String, Object>> getTree(List<TbItemCat> itemCat, Long parentId) {
        // 定义返回数据结果集
        List<Map<String, Object>> listTree = new ArrayList<>();
        // 遍历菜单
        for (int i = 0; i<itemCat.size(); i++){
            // 定义Map用来存放组装的数据
            Map<String, Object> treeVo = null;
            // 获取单个菜单对象
            TbItemCat tbItemCat = itemCat.get(i);
            if (tbItemCat.getParentId().equals(parentId)){
                // 实例化map对象
                treeVo = new HashMap<>();
                treeVo.put("id",tbItemCat.getId());
                treeVo.put("name",tbItemCat.getName());
                treeVo.put("parentId",tbItemCat.getParentId());
                treeVo.put("typeId",tbItemCat.getTypeId());
                treeVo.put("parentPath",tbItemCat.getParentPath());
                treeVo.put("children",getTree(itemCat,tbItemCat.getId()));
            }
            // 如果Map有数据
            if (treeVo != null){
                // 将没有子节点的数据删除
                // 1. 获取到Map的子节点
                List<Map<String, Object>> children = (List<Map<String, Object>>) treeVo.get("children");
                // 2. 判断子节点是否有数据
                if (children.size() == 0){
                    // 将Node节点删除
                    treeVo.remove("children");
                }
                // 将Map放入list中
                listTree.add(treeVo);
            }
        }
        return listTree;
    }
}
